package com.wing.productionPlan.utils;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.ClientAnchor.AnchorType;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URL;
import java.security.SecureRandom;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicInteger;

/**
 *
 * Excel导出工具类
 */
@SuppressWarnings("unused")
public class CodeGeneratorUtils {

    // 静态变量用于保存序列号，使用AtomicInteger确保线程安全
    private static final AtomicInteger sequence = new AtomicInteger(0);
    private static final Object lock = new Object();

    // 格式化当前时间为"YYYYMMDDHHMMSS"
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

    /**
     * 生成类似"TJ20240506002"的代码
     * @return 生成的代码字符串
     */
    public static synchronized String generateCode() {
        // 获取当前时间并格式化
        String dateTimeStr = LocalDateTime.now().format(formatter);

        // 确保每次生成新的日期时，序列号重置为1
        if (!dateTimeStr.equals(getDatePart(dateTimeStr))) {
            sequence.set(0);
        }

        // 获取序列号，并以3位数字格式填充前置零
        String seqStr = String.format("%03d", sequence.incrementAndGet());

        // 返回组合后的结果
        return "TJ" + dateTimeStr + seqStr;
    }

    // 辅助方法：提取日期部分用于比较是否进入新的一秒
    private static String getDatePart(String dateTimeStr) {
        // 假设此方法用于比较是否进入新的一秒，因此返回整个日期时间字符串
        return dateTimeStr;
    }



    /**
     * 生成一个以83开头的12位字符串
     * @return 生成的代码字符串
     */
    public static synchronized String generateCodeNumber() {
      /*  // 获取当前序列号并递增
        long seq = sequence.incrementAndGet();

        // 如果序列号超出9999999999，则重置序列号，防止超过12位
        if (seq > 9999999999L) {
            sequence.set(0);
        }

        // 格式化输出，确保总长度为12位，以"83"开头
        return String.format("83%010d", seq);*/

        // 创建一个SecureRandom对象
        SecureRandom secureRandom = new SecureRandom();
        // 生成以83开头的12位字符串
        StringBuilder sb = new StringBuilder("83");
        for (int i = 0; i < 10; i++) { // 因为已经添加了两位，所以只需再添加10位
            // 生成0到9之间的随机数字并追加到StringBuilder中
            sb.append(secureRandom.nextInt(10));
        }
        // 输出结果
         return sb.toString();
    }





    // 主方法用于测试
    public static void main(String[] args) {
        // 测试生成代码
        System.out.println(CodeGeneratorUtils.generateCode());
    }


}
